const express = require("express");
const cors = require("cors");
const joi = require("joi");
const app = express();
const expressJwt = require("express-jwt");
const config = require("./config.js");
app.use(cors());
app.use(express.urlencoded({ extended: false }));
const useRouter = require("./router/user.js");
const useUserInfoRouter = require("./router/userInfo.js");

//这个是定义的公共中间件来  优化res.send()代码---注意一定要注册使用路由之前定义
app.use((req, res, next) => {
  // status 0成功，status=1失败 ; 默认将status=1的值设置为1 方便处理失败的情况
  res.cc = (err, status = 1) => {
    res.send({
      status,
      message: err instanceof Error ? err.message : err,
    });
  };
  next();
});

// 一定要在路由注册之前配置解析token的中间件
app.use(
  expressJwt
    .expressjwt({ secret: config.jwtSecretKey, algorithms: ["HS256"] })
    .unless({
      path: [/^\/api/],
    })
);
// 导入并使用用户路由模块
app.use("/api", useRouter);
app.use("/my", useUserInfoRouter);

//定义错误级别的中间件
app.use((err, req, res, next) => {
  if (err instanceof joi.ValidationError) return res.cc(err);
  // 身份认证失败后的错误
  if ((err.name = "UnauthorizedError"))
    return res.cc("token失效，身份认证失败，请重新登录！");
  res.cc(err);
});
app.listen(3888, () => {
  console.log("Server is running on port http://127.0.0.1:3888");
});
